// TokenUtil.java
package com.easy.util;

import cn.hutool.jwt.JWTUtil;
import java.util.Date;
import java.util.Map;
import com.easy.bean.UserAccount;

public class TokenUtil {
    private static final String SIGN_KEY = "factory_system_key_1234567890";
    private static final Long EXPIRE_TIME = 86400000L; // 24小时
    private static final String TOKEN_KEY = "easy";

    /**
     * 生成Token - 兼容旧版本调用
     */
    public static String genToken(UserAccount userAccount) {
        return getToken(userAccount.getId(), userAccount.getRole());
    }

    /**
     * 生成Token
     */
    public static String getToken(Integer id, String role) {
        //用户名和密码可以没有，想传什么就放什么数据，password永远不能出服务器后端的，因此不能放
        Map<String, Object> map = Map.of(
                "userId", id,
                "role", role,
                "expire", System.currentTimeMillis() + EXPIRE_TIME
        );
        String token = JWTUtil.createToken(map, SIGN_KEY.getBytes());
        System.out.println("生成的token: " + token);
        return token;
    }

    /**
     * 验证token
     * @param token 待验证的token
     * @return 验证结果
     */
    public static boolean verify(String token) {
        if (token == null || token.isEmpty()) {
            System.out.println("Token为空或null");
            return false;
        }

        // 如果token以"Bearer "开头，需要去掉前缀
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }

        try {
            // 先尝试直接验证token
            boolean result = JWTUtil.verify(token, SIGN_KEY.getBytes());
            if (!result) {
                // 如果失败，再尝试处理URL安全的Base64字符
                String cleanToken = token.replace('-', '+').replace('_', '/');
                result = JWTUtil.verify(cleanToken, SIGN_KEY.getBytes());
            }
            System.out.println("Token验证结果: " + result);
            return result;
        } catch (Exception e) {
            System.out.println("Token验证异常: " + e.getMessage());
            return false;
        }
    }

    /**
     * 从token中获取指定key的值
     * @param token token字符串
     * @param key 键名
     * @return 对应的值
     */
    public static String getOption(String token, String key) {
        if (token == null || token.isEmpty()) {
            return null;
        }

        // 如果token以"Bearer "开头，需要去掉前缀
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }

        try {
            // 先尝试直接解析token
            Object value = JWTUtil.parseToken(token).getPayload(key);
            if (value != null) {
                return value.toString();
            }

            // 如果失败，再尝试处理URL安全的Base64字符
            String cleanToken = token.replace('-', '+').replace('_', '/');
            return JWTUtil.parseToken(cleanToken).getPayload(key).toString();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取当前用户
     * @return 当前用户名
     */
    public static String getCurrentUser() {
        // 这里简化处理，实际项目中可以通过拦截器将用户信息存入ThreadLocal
        return "admin";
    }

    public static void main(String[] args) {
        // 测试代码可以根据需要添加
        System.out.println("TokenUtil modified successfully.");
    }
}

